home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / frontend / flyEditor / LeftView.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-21  |  20.8 KB  |  845 lines

  1. // LeftView.cpp : implementation of the CLeftView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "flyEditor.h"
  6. #include "flyEditorDoc.h"
  7. #include "flyEditorView.h"
  8. #include "flyRenderView.h"
  9. #include "LeftView.h"
  10.  
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16.  
  17. extern CFlyRenderView *rv;
  18. extern CFlyEditorView *lv;
  19. extern int active_mode;
  20. extern bsp_object *active_sel;
  21. CLeftView *tv=0;
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CLeftView
  25.  
  26. IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
  27.  
  28. BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
  29.     //{{AFX_MSG_MAP(CLeftView)
  30.     ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  31.     ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
  32.     ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
  33.     ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
  34.     ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
  35.     ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  36.     ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
  37.     ON_COMMAND(ID_EDIT_INSERT, OnEditInsert)
  38.     ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
  39.     ON_UPDATE_COMMAND_UI(ID_EDIT_INSERT, OnUpdateEditInsert)
  40.     ON_COMMAND(ID_EDIT_RENAME, OnEditRename)
  41.     ON_UPDATE_COMMAND_UI(ID_EDIT_RENAME, OnUpdateEditRename)
  42.     ON_UPDATE_COMMAND_UI(ID_DOWN, OnUpdateDown)
  43.     ON_COMMAND(ID_DOWN, OnDown)
  44.     ON_UPDATE_COMMAND_UI(ID_UP, OnUpdateUp)
  45.     ON_COMMAND(ID_UP, OnUp)
  46.     ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  47.     ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
  48.     ON_COMMAND(ID_EDIT_CUT, OnEditCut)
  49.     ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
  50.     ON_COMMAND(ID_EDIT_DUPLICATE, OnEditDuplicate)
  51.     ON_UPDATE_COMMAND_UI(ID_EDIT_DUPLICATE, OnUpdateEditDuplicate)
  52.     ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
  53.     ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
  54.     //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56.  
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CLeftView construction/destruction
  59.  
  60. CLeftView::CLeftView()
  61. {
  62.     tv=this;
  63. }
  64.  
  65. CLeftView::~CLeftView()
  66. {
  67.     tv=0;
  68. }
  69.  
  70. BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
  71. {
  72.     return CTreeView::PreCreateWindow(cs);
  73. }
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CLeftView drawing
  77.  
  78. void CLeftView::OnDraw(CDC* pDC)
  79. {
  80.     CFlyEditorDoc* pDoc = GetDocument();
  81.     ASSERT_VALID(pDoc);
  82. }
  83.  
  84. void CLeftView::OnInitialUpdate()
  85. {
  86.     CTreeView::OnInitialUpdate();
  87. }
  88.  
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CLeftView diagnostics
  91.  
  92. #ifdef _DEBUG
  93. void CLeftView::AssertValid() const
  94. {
  95.     CTreeView::AssertValid();
  96. }
  97.  
  98. void CLeftView::Dump(CDumpContext& dc) const
  99. {
  100.     CTreeView::Dump(dc);
  101. }
  102.  
  103. CFlyEditorDoc* CLeftView::GetDocument() // non-debug version is inline
  104. {
  105.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFlyEditorDoc)));
  106.     return (CFlyEditorDoc*)m_pDocument;
  107. }
  108. #endif //_DEBUG
  109.  
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CLeftView message handlers
  112.  
  113. void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  114. {
  115.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  116.     if (pResult) *pResult = 0;
  117.  
  118.     int i,j;
  119.     char buf[256];
  120.  
  121.     CFlyEditorDoc *doc=GetDocument();
  122.  
  123.     CListCtrl& list=lv->GetListCtrl();
  124.     
  125.     list.DeleteAllItems();
  126.     list.ModifyStyle(0,LVS_SHOWSELALWAYS);
  127.  
  128.     for( i=0;i<lv->ncol;i++ )
  129.     {
  130.     lv->colsizes[i]=list.GetColumnWidth(0);
  131.     list.DeleteColumn(0);
  132.     }
  133.     lv->ncol=0;
  134.  
  135.     CTreeCtrl& tree=GetTreeCtrl();
  136.     HTREEITEM item=tree.GetSelectedItem();
  137.     if (item==0) return;
  138.     DWORD type=tree.GetItemData(item);
  139.  
  140.     GetDocument()->find_active();
  141.     if (type>255)
  142.         {
  143.         bsp_object *o;
  144.         if (active_mode)
  145.             o=active_sel;
  146.         else 
  147.             o=(bsp_object *)type;
  148.         lv->set_param_list(o);
  149.         }
  150.     else
  151.     switch(type)
  152.     {
  153.     case TREE_TYPE_TEXTURES:
  154.         list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
  155.         list.InsertColumn( 1, "Size", LVCFMT_LEFT, lv->colsizes[1],0 );
  156.         lv->ncol=2;
  157.         for( i=0;i<doc->npiclib;i++ )
  158.             {
  159.             list.InsertItem(i,doc->piclib[i]->name);
  160.             sprintf(buf,"%ix%ix%i",doc->piclib[i]->sx,doc->piclib[i]->sy,doc->piclib[i]->bytespixel*8);
  161.             list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
  162.             }
  163.         break;
  164.     case TREE_TYPE_LIGHTMAPS:
  165.         list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
  166.         list.InsertColumn( 1, "Size", LVCFMT_LEFT, lv->colsizes[1],0 );
  167.         lv->ncol=2;
  168.         for( i=0;i<doc->nlmpic;i++ )
  169.             {
  170.             sprintf(buf,"lightmap%i",i);
  171.             list.InsertItem(i,buf);
  172.             sprintf(buf,"%ix%ix%i",doc->lmpic[i]->sizex,doc->lmpic[i]->sizey,24);
  173.             list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
  174.             }
  175.         break;
  176.     case TREE_TYPE_OBJECTS:
  177.         {
  178.         list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
  179.         list.InsertColumn( 1, "nvert", LVCFMT_LEFT, lv->colsizes[1],0 );
  180.         list.InsertColumn( 2, "nface", LVCFMT_LEFT, lv->colsizes[2],0 );
  181.         lv->ncol=3;
  182.         mesh *o=doc->model_obj0;
  183.         i=0;
  184.         while(o)
  185.             {
  186.             list.InsertItem(i,o->name);
  187.             sprintf(buf,"%i",o->nv);
  188.             list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
  189.             sprintf(buf,"%i",o->nf);
  190.             list.SetItem(i,2,LVIF_TEXT,buf,0,0,0,0);
  191.             i++;
  192.             o=(mesh *)o->next_obj;
  193.             }
  194.         }
  195.         break;
  196.     case TREE_TYPE_SOUNDS:
  197.         {
  198.         list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
  199.         list.InsertColumn( 1, "Length", LVCFMT_LEFT, lv->colsizes[1],0 );
  200.         list.InsertColumn( 2, "Format", LVCFMT_LEFT, lv->colsizes[2],0 );
  201.         lv->ncol=3;
  202.         sound *s=doc->sound_obj0;
  203.         i=0;
  204.         while(s)
  205.             {
  206.             char *c=strrchr(s->name,'.');
  207.             if (c && (c[1]=='w'||c[1]=='W') && (c[2]=='a'||c[2]=='A') && (c[3]=='v'||c[3]=='V'))
  208.                 {
  209.                 list.InsertItem(i,s->name);
  210.                 sprintf(buf,"%ims",s->total_time);
  211.                 list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
  212.                 if (s->buf[0])
  213.                     {
  214.                     WAVEFORMATEX format;
  215.                     DWORD d;
  216.                     s->buf[0]->GetFormat(&format,sizeof(format),&d);
  217.                     sprintf(buf,"%ix%ix%i",(int)format.nSamplesPerSec,(int)format.wBitsPerSample,(int)format.nChannels);
  218.                     list.SetItem(i,2,LVIF_TEXT,buf,0,0,0,0);
  219.                     }
  220.                 i++;
  221.                 }
  222.             s=(sound *)s->next_obj;
  223.             }
  224.         }
  225.         break;
  226.     case TREE_TYPE_GLOBAL:
  227.         lv->reset_param_list();    
  228.         i=flyengine->get_global_param_desc(0,0);
  229.         for( j=0;j<i;j++ )
  230.             {
  231.             flyengine->get_global_param_desc(j,&lv->pd[j]);
  232.             lv->insert_param(lv->pd[j].name,lv->pd[j].type,lv->pd[j].data);
  233.             }
  234.         lv->fill_param_list();
  235.         break;
  236.     }
  237.  
  238.     if (active_mode)
  239.         GetDocument()->find_active();
  240.  
  241.     rv->Invalidate(0);
  242. }
  243.  
  244. void CLeftView::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  245. {
  246.     TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
  247.  
  248.     CTreeCtrl& tree=GetTreeCtrl();
  249.     DWORD type=tree.GetItemData(pTVDispInfo->item.hItem);
  250.  
  251.     if (type>255)
  252.         {
  253.         CEdit *edit=tree.GetEditControl();
  254.         edit->SetLimitText(30);
  255.         *pResult = 0;
  256.         }
  257.     else
  258.         *pResult = 1;
  259. }
  260.  
  261. void CLeftView::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  262. {
  263.     TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
  264.  
  265.     if (pTVDispInfo->item.pszText && pTVDispInfo->item.pszText[0] && pTVDispInfo->item.pszText[0]!=' ')
  266.     {
  267.     CTreeCtrl& tree=GetTreeCtrl();
  268.     bsp_object *o=(bsp_object *)tree.GetItemData(pTVDispInfo->item.hItem);
  269.  
  270.     strcpy(o->long_name,pTVDispInfo->item.pszText);
  271.     char *c;
  272.     while( c=strchr(o->long_name,' ') )
  273.         *c='_';
  274.     bsp_object *obj=flyengine->active_obj0;
  275.     while(obj)
  276.         {
  277.         if (obj->source==o)
  278.             strcpy(obj->long_name,o->long_name);
  279.         obj=(bsp_object *)obj->next_obj;
  280.         }
  281.  
  282.     tree.SetItemText(pTVDispInfo->item.hItem,o->long_name);
  283.     GetDocument()->SetModifiedFlag();
  284.     }
  285.  
  286.     *pResult = 0;
  287. }
  288.  
  289. void CLeftView::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult) 
  290. {
  291.     TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  292.     if (pResult) 
  293.         *pResult = 0;
  294.  
  295.     CTreeCtrl& tree=GetTreeCtrl();
  296.     HTREEITEM item=tree.GetSelectedItem();
  297.     if (item==0) return;
  298.     DWORD type=tree.GetItemData(item);
  299.     char str[256];
  300.     
  301.     switch(pTVKeyDown->wVKey)
  302.     {
  303.     case VK_DELETE:
  304.         if (type>255)
  305.             {
  306.             bsp_object *o=(bsp_object *)type;
  307.             sprintf(str,"Delete object class '%s' and all active instances and references ?",o->long_name);
  308.             HTREEITEM item2=tree.GetParentItem(item);
  309.             if (IDYES==AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
  310.                 {
  311.                 GetDocument()->dll.delete_class(o);
  312.                 tree.DeleteItem(item);
  313.                 GetDocument()->SetModifiedFlag();
  314.                 if (tree.ItemHasChildren(item2)==0)
  315.                     tree.SetItemImage(item2,0,0);
  316.                 }
  317.             }
  318.         else if (type==TREE_TYPE_DLLS)
  319.             {
  320.             CString s=tree.GetItemText(item);
  321.             sprintf(str,"Delete plugin '%s' and all it's stock and active classes ?",(char *)(LPCSTR)s);
  322.             HTREEITEM item2=tree.GetParentItem(item);
  323.             if (IDYES==AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
  324.                 {
  325.                 GetDocument()->dll.delete_dll((char *)(LPCSTR)s);
  326.                 tree.DeleteItem(item);
  327.                 GetDocument()->SetModifiedFlag();
  328.                 if (tree.ItemHasChildren(item2)==0)
  329.                     tree.SetItemImage(item2,0,0);
  330.                 }
  331.             }
  332.         rv->Invalidate(0);
  333.         break;
  334.     case VK_INSERT:
  335.         if (flyengine->flydatapath[0]==0)
  336.             AfxMessageBox("You must save the fly file before including new objects.",MB_OK|MB_ICONINFORMATION);
  337.         else
  338.         if (type==TREE_TYPE_OBJECTS)
  339.         {
  340.         char file[256];
  341.         strcpy(file,flyengine->flydatapath);
  342.         strcat(file,"objects\\");
  343.         strcat(file,"*.3ds;*.fao");
  344.         char *c=lv->edit_files("","All object files (*.3ds;*.fao)|*.3ds;*.fao|3dstudio object files (*.3ds)|*.3ds|Fly animated object files (*.fao)|*.fao||",file);
  345.         if (c)
  346.             {
  347.             flyengine->get_model_object(c);
  348.             OnSelchanged(0,0);
  349.             }
  350.         }
  351.         else
  352.         if (type==TREE_TYPE_TEXTURES)
  353.         {
  354.         char file[256];
  355.         strcpy(file,flyengine->flydatapath);
  356.         strcat(file,"maps\\");
  357.         strcat(file,"*.jpg;*.tga");
  358.         char *c=lv->edit_files("","All image files (*.jpg;*.tga)|*.jpg;*.tga|TGA image files (*.tga)|*.tga|JPG image files (*.jpg)|*.jpg||",file);
  359.         if (c)
  360.             {
  361.             flyengine->get_picture(c);
  362.             flyengine->close_texture_cache();
  363.             flyengine->init_texture_cache();
  364.             OnSelchanged(0,0);
  365.             }
  366.         }
  367.         else
  368.         if (type==TREE_TYPE_PLUGINS)
  369.         {
  370.             char str[256];
  371.             strcpy(str,flyengine->flysdkpath);
  372.             strcat(str,"plugin\\*.dll");
  373.             char *file=lv->edit_files("dll","Fly plugin dll files (*.dll)|*.dll||",str);
  374.             if (file)
  375.             {
  376.                 int c=flyengine->dll.ncd,i;
  377.                 int dll=flyengine->dll.add_dll(file);
  378.                 if (dll!=-1)
  379.                 {
  380.                     flyengine->dll.load_classes(dll,0);
  381.                     HTREEITEM item2,item3;
  382.                     item2=tree.GetChildItem(item);
  383.                     if (item2==0)
  384.                         item3=tree.InsertItem(file,item);
  385.                     else 
  386.                         {
  387.                         while( item3=tree.GetNextSiblingItem(item2) )
  388.                             item2=item3;
  389.                         item3=tree.InsertItem(file,item,item2);
  390.                         }
  391.                     tree.SetItemData(item3,TREE_TYPE_DLLS);
  392.                     tree.SetItemImage(item3,TREE_TYPE_DLLS*2,TREE_TYPE_DLLS*2+1);
  393.                     for( i=c;i<flyengine->dll.ncd;i++ )
  394.                         {
  395.                         item2=tree.InsertItem(flyengine->dll.cd[i]->get_name(),item3);
  396.                         tree.SetItemData(item2,TREE_TYPE_STOCK);
  397.                         tree.SetItemImage(item2,TREE_TYPE_STOCK*2,TREE_TYPE_STOCK*2+1);
  398.                         }
  399.                     tree.EnsureVisible(item3);
  400.                     tree.SelectItem(item3);
  401.                     tree.Expand(item3,TVE_EXPAND);
  402.                     GetDocument()->SetModifiedFlag();
  403.                 }
  404.             }
  405.         }
  406.         else if (type==TREE_TYPE_STOCK)
  407.         {
  408.             CString s=tree.GetItemText(item);
  409.             bsp_object *o=flyengine->dll.add_class((char *)(LPCSTR)s);
  410.             if (o)
  411.                 {
  412.                 static int count=1;
  413.                 sprintf(str,"new %s %i",(char *)(LPCSTR)s,count++);
  414.                 HTREEITEM item2,item3;
  415.                 item2=tree.GetChildItem(item);
  416.                 if (item2==0)
  417.                     item3=tree.InsertItem(str,item);
  418.                 else 
  419.                     {
  420.                     while( item3=tree.GetNextSiblingItem(item2) )
  421.                         item2=item3;
  422.                     item3=tree.InsertItem(str,item,item2);
  423.                     }
  424.                 tree.SetItemData(item3,(DWORD)o);
  425.                 tree.SetItemImage(item3,TREE_TYPE_DYNOBJECT*2,TREE_TYPE_DYNOBJECT*2+1);
  426.                 tree.EnsureVisible(item3);
  427.                 tree.SelectItem(item3);
  428.                 tree.EditLabel(item3);
  429.                 strcpy(o->long_name,str);
  430.                 o->name[0]=0;
  431.                 GetDocument()->SetModifiedFlag();
  432.                 }
  433.         }
  434.         rv->Invalidate(0);
  435.         break;
  436.     }
  437. }
  438.  
  439. void CLeftView::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
  440. {
  441.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  442.     *pResult = 0;
  443.     CTreeCtrl& tree=GetTreeCtrl();
  444.     if (pNMTreeView->action==2)
  445.         tree.SetItemImage(pNMTreeView->itemNew.hItem,1,1);
  446.     else 
  447.     if (pNMTreeView->action==1)
  448.         tree.SetItemImage(pNMTreeView->itemNew.hItem,0,0);
  449. }
  450.  
  451. void CLeftView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  452. {
  453.     CMenu *menu;
  454.     menu=AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(1);
  455.  
  456.     CTreeCtrl& tree=tv->GetTreeCtrl();
  457.  
  458.     TVHITTESTINFO hti;
  459.     GetCursorPos(&hti.pt);
  460.     ScreenToClient(&hti.pt);
  461.     tree.HitTest(&hti);
  462.     if (hti.flags&TVHT_ONITEMLABEL)
  463.         tree.SelectItem(hti.hItem);
  464.     
  465.     GetCursorPos(&hti.pt);
  466.     menu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,hti.pt.x,hti.pt.y,AfxGetApp()->GetMainWnd(),0);
  467.  
  468.     *pResult = 0;
  469. }
  470.  
  471. void CLeftView::OnEditDelete() 
  472. {
  473.     TV_KEYDOWN key;
  474.     key.wVKey=VK_DELETE;
  475.     OnKeydown((NMHDR*)&key,0);
  476. }
  477.  
  478. void CLeftView::OnEditInsert() 
  479. {
  480.     TV_KEYDOWN key;
  481.     key.wVKey=VK_INSERT;
  482.     OnKeydown((NMHDR*)&key,0);
  483. }
  484.  
  485. void CLeftView::OnEditRename() 
  486. {
  487.     CTreeCtrl& tree=tv->GetTreeCtrl();
  488.     HTREEITEM item=tree.GetSelectedItem();
  489.     if (item==0) return;
  490.     tree.EditLabel( item );
  491. }
  492.  
  493. void CLeftView::OnUpdateEditRename(CCmdUI* pCmdUI) 
  494. {
  495.     CTreeCtrl& tree=tv->GetTreeCtrl();
  496.     HTREEITEM item=tree.GetSelectedItem();
  497.     if (item==0) return;
  498.     DWORD o=tree.GetItemData(item);
  499.     pCmdUI->Enable(item!=0 && o>255);
  500. }
  501.  
  502. void CLeftView::OnUpdateEditInsert(CCmdUI* pCmdUI) 
  503. {
  504.     CTreeCtrl& tree=tv->GetTreeCtrl();
  505.     HTREEITEM item=tree.GetSelectedItem();
  506.     if (item==0) return;
  507.     DWORD o=tree.GetItemData(item);
  508.  
  509.     pCmdUI->Enable(item!=0 && (o==TREE_TYPE_OBJECTS || o==TREE_TYPE_TEXTURES || o==TREE_TYPE_PLUGINS || o==TREE_TYPE_STOCK));
  510. }
  511.  
  512. void CLeftView::OnUpdateEditDelete(CCmdUI* pCmdUI) 
  513. {
  514.     CTreeCtrl& tree=tv->GetTreeCtrl();
  515.     HTREEITEM item=tree.GetSelectedItem();
  516.     if (item==0) return;
  517.     DWORD o=tree.GetItemData(item);
  518.  
  519.     pCmdUI->Enable(item!=0 && (o==TREE_TYPE_DLLS || o>255));
  520. }
  521.  
  522. HTREEITEM CLeftView::SelectObject(HTREEITEM item,bsp_object *o)
  523. {
  524.     CTreeCtrl& tree=tv->GetTreeCtrl();
  525.     DWORD type=tree.GetItemData(item);
  526.     if (type>255)
  527.         if (o==(bsp_object *)type)
  528.             {
  529.             tree.SelectItem(item);
  530.             return item;
  531.             }
  532.     HTREEITEM item2,item3;
  533.     if (tree.ItemHasChildren(item))
  534.     {
  535.         item2=SelectObject(tree.GetChildItem(item),o);
  536.         if (item2)
  537.             return item2;
  538.     }
  539.     item3=item;
  540.     while(item3=tree.GetNextSiblingItem(item3))
  541.     {
  542.         item2=SelectObject(item3,o);
  543.         if (item2)
  544.             return item2;
  545.     }
  546.  
  547.     return 0;
  548. }
  549. void CLeftView::OnUpdateDown(CCmdUI* pCmdUI) 
  550. {
  551.     CTreeCtrl& tree=tv->GetTreeCtrl();
  552.     HTREEITEM item=tree.GetSelectedItem();
  553.     if (item==0) return;
  554.     DWORD o=tree.GetItemData(item);
  555.     pCmdUI->Enable(o==TREE_TYPE_DLLS && tree.GetNextSiblingItem(item));
  556. }
  557.  
  558. int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, 
  559.         LPARAM lParamSort)
  560. {
  561.     return (int)lParam1-(int)lParam2;
  562. }
  563.  
  564. void CLeftView::OnDown() 
  565. {
  566.     CTreeCtrl& tree=tv->GetTreeCtrl();
  567.     HTREEITEM item=tree.GetSelectedItem();
  568.     if (item==0) return;
  569.  
  570.     flyengine->dll.move_dll((char *)(LPCSTR)tree.GetItemText(item),1);
  571.  
  572.     HTREEITEM p=tree.GetParentItem(item);
  573.     HTREEITEM i=tree.GetChildItem(p);
  574.     int n=0;
  575.     while(i)
  576.         {
  577.         tree.SetItemData(i,n++);
  578.         i=tree.GetNextSiblingItem(i);
  579.         }
  580.  
  581.     HTREEITEM a=tree.GetNextSiblingItem(item);
  582.     int d=tree.GetItemData(a);
  583.     tree.SetItemData(item,d);
  584.     tree.SetItemData(a,d-1);
  585.  
  586.     TVSORTCB data;
  587.     data.lParam=0;
  588.     data.lpfnCompare=CompareFunc;
  589.     data.hParent=p;
  590.     tree.SortChildrenCB(&data);
  591.  
  592.     i=tree.GetChildItem(p);
  593.     while(i)
  594.         {
  595.         tree.SetItemData(i,TREE_TYPE_DLLS);
  596.         i=tree.GetNextSiblingItem(i);
  597.         }
  598.  
  599.     GetDocument()->SetModifiedFlag();
  600. }
  601.  
  602. void CLeftView::OnUpdateUp(CCmdUI* pCmdUI) 
  603. {
  604.     CTreeCtrl& tree=tv->GetTreeCtrl();
  605.     HTREEITEM item=tree.GetSelectedItem();
  606.     if (item==0) return;
  607.     DWORD o=tree.GetItemData(item);
  608.     pCmdUI->Enable(o==TREE_TYPE_DLLS && tree.GetPrevSiblingItem(item));
  609. }
  610.  
  611. void CLeftView::OnUp() 
  612. {
  613.     CTreeCtrl& tree=tv->GetTreeCtrl();
  614.     HTREEITEM item=tree.GetSelectedItem();
  615.     if (item==0) return;
  616.  
  617.     flyengine->dll.move_dll((char *)(LPCSTR)tree.GetItemText(item),-1);
  618.  
  619.     HTREEITEM p=tree.GetParentItem(item);
  620.     HTREEITEM i=tree.GetChildItem(p);
  621.     int n=0;
  622.     while(i)
  623.         {
  624.         tree.SetItemData(i,n++);
  625.         i=tree.GetNextSiblingItem(i);
  626.         }
  627.  
  628.     HTREEITEM a=tree.GetPrevSiblingItem(item);
  629.     int d=tree.GetItemData(a);
  630.     tree.SetItemData(item,d);
  631.     tree.SetItemData(a,d+1);
  632.  
  633.     TVSORTCB data;
  634.     data.lParam=0;
  635.     data.lpfnCompare=CompareFunc;
  636.     data.hParent=p;
  637.     tree.SortChildrenCB(&data);
  638.  
  639.     i=tree.GetChildItem(p);
  640.     while(i)
  641.         {
  642.         tree.SetItemData(i,TREE_TYPE_DLLS);
  643.         i=tree.GetNextSiblingItem(i);
  644.         }
  645.  
  646.     GetDocument()->SetModifiedFlag();
  647. }
  648.  
  649. void CLeftView::OnEditCut() 
  650. {
  651.     OnEditCopy();
  652.  
  653.     CFlyEditorDoc* pDoc = GetDocument();
  654.     CTreeCtrl& tree=tv->GetTreeCtrl();
  655.     HTREEITEM item=tree.GetSelectedItem();
  656.     HTREEITEM item2=tree.GetParentItem(item);
  657.     DWORD type=tree.GetItemData(item);
  658.     bsp_object *o=(bsp_object *)type;
  659.     pDoc->dll.delete_class(o);
  660.     tree.DeleteItem(item);
  661.     if (tree.ItemHasChildren(item2)==0)
  662.         tree.SetItemImage(item2,0,0);
  663.     pDoc->SetModifiedFlag();
  664. }
  665.  
  666. void CLeftView::OnUpdateEditCut(CCmdUI* pCmdUI) 
  667. {
  668.     CTreeCtrl& tree=tv->GetTreeCtrl();
  669.     HTREEITEM item=tree.GetSelectedItem();
  670.     DWORD type=0;
  671.     if (item!=0) 
  672.         type=tree.GetItemData(item);
  673.     pCmdUI->Enable(type>255);
  674. }
  675.  
  676. void CLeftView::OnEditCopy() 
  677. {
  678.     CFlyEditorDoc* pDoc = GetDocument();
  679.     CTreeCtrl& tree=tv->GetTreeCtrl();
  680.     HTREEITEM item=tree.GetSelectedItem();
  681.     DWORD type=tree.GetItemData(item);
  682.     bsp_object *o=(bsp_object *)type;
  683.  
  684.     if ( ::OpenClipboard(0) )
  685.     {
  686.         EmptyClipboard();
  687.  
  688.         HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE,16384);
  689.         char *buf=(char *)GlobalLock(hData);
  690.         char str[256];
  691.         int i,j;
  692.         param_desc pd;
  693.         for( i=0;i<pDoc->dll.ncd;i++ )
  694.             if (pDoc->dll.cd[i]->get_type()==o->type)
  695.                 break;
  696.  
  697.         buf[0]=0;
  698.  
  699.         sprintf(str,"fly3dclass %s %s\r\n",pDoc->dll.cd[i]->get_name(),o->long_name);
  700.         strcat(buf,str);
  701.  
  702.         j=o->get_param_desc(0,0);
  703.         for( i=0;i<j;i++ )
  704.         {
  705.             o->get_param_desc(i,&pd);
  706.             sprintf(str,"%s=%s\r\n",pd.name,pd.get_string());
  707.             strcat(buf,str);
  708.         }
  709.  
  710.         GlobalUnlock(hData);
  711.         SetClipboardData( CF_TEXT, hData );
  712.  
  713.         CloseClipboard();    
  714.     }
  715. }
  716.  
  717. void CLeftView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
  718. {
  719.     CTreeCtrl& tree=tv->GetTreeCtrl();
  720.     HTREEITEM item=tree.GetSelectedItem();
  721.     DWORD type=0;
  722.     if (item!=0) 
  723.         type=tree.GetItemData(item);
  724.     pCmdUI->Enable(type>255);
  725. }
  726.  
  727. void CLeftView::OnEditPaste() 
  728. {
  729.     if (IsClipboardFormatAvailable(CF_TEXT))
  730.     {
  731.         if (::OpenClipboard(0))
  732.         {
  733.             HGLOBAL hData=GetClipboardData(CF_TEXT);
  734.             if (hData)
  735.                 {
  736.                 char *buf=(char *)GlobalLock(hData);
  737.  
  738.                 char *c1=strchr(buf,'\r');
  739.                 *c1=0;
  740.                 c1+=2;
  741.                 char *c2=strchr(buf,' ');
  742.                 *(c2++)=0;
  743.                 char *c3=strchr(c2,' ');
  744.                 *(c3++)=0;
  745.  
  746.                 bsp_object *o=flyengine->dll.add_class(c2);
  747.                 if (o)
  748.                     {
  749.                     strcpy(o->long_name,c3);
  750.                     strcat(o->long_name,"_copy");
  751.                     o->name[0]=0;
  752.  
  753.                     param_desc pd;
  754.                     int i,j,k;
  755.                     j=o->get_param_desc(0,0);
  756.                     for( i=0;i<j;i++ )
  757.                     {
  758.                         o->get_param_desc(i,&pd);
  759.                         k=strlen(pd.name);
  760.                         if (memcmp(pd.name,c1,k)==0)
  761.                         {
  762.                         c2=&c1[k+1];
  763.                         c3=strchr(c1,'\r');
  764.                         *c3=0;
  765.                         c1=c3+2;
  766.                         pd.set_string(c2);
  767.                         }
  768.                     }
  769.  
  770.                     CTreeCtrl& tree=tv->GetTreeCtrl();
  771.                     HTREEITEM item=tree.GetSelectedItem();
  772.                     HTREEITEM item2,item3;
  773.                     item2=tree.GetChildItem(item);
  774.                     if (item2==0)
  775.                         item3=tree.InsertItem(o->long_name,item);
  776.                     else 
  777.                         {
  778.                         while( item3=tree.GetNextSiblingItem(item2) )
  779.                             item2=item3;
  780.                         item3=tree.InsertItem(o->long_name,item,item2);
  781.                         }
  782.  
  783.                     tree.SetItemData(item3,(DWORD)o);
  784.                     tree.SetItemImage(item3,TREE_TYPE_DYNOBJECT*2,TREE_TYPE_DYNOBJECT*2+1);
  785.                     tree.EnsureVisible(item3);
  786.                     tree.SelectItem(item3);
  787.                     tree.EditLabel(item3);
  788.                     }
  789.                 else AfxMessageBox("Could not paste !\nClass name not present in scene.",MB_OK|MB_ICONINFORMATION);
  790.  
  791.                 GlobalUnlock(hData);
  792.                 GetDocument()->SetModifiedFlag();
  793.                 }
  794.             CloseClipboard();
  795.         }
  796.     }
  797. }
  798.  
  799. void CLeftView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
  800. {
  801.     int pasteok=0;
  802.     
  803.     CTreeCtrl& tree=tv->GetTreeCtrl();
  804.     HTREEITEM item=tree.GetSelectedItem();
  805.     if (item && tree.GetItemData(item)==TREE_TYPE_STOCK)
  806.     if (IsClipboardFormatAvailable(CF_TEXT))
  807.     {
  808.         if (::OpenClipboard(0))
  809.         {
  810.             HGLOBAL hData=GetClipboardData(CF_TEXT);
  811.             if (hData)
  812.                 {
  813.                 char *buf=(char *)GlobalLock(hData);
  814.                 CString s=tree.GetItemText(item);
  815.                 if (memcmp(buf,"fly3dclass ",11)==0)
  816.                     if (memcmp(&buf[11],s,s.GetLength())==0)
  817.                         pasteok=1;
  818.                 GlobalUnlock(hData);
  819.                 }
  820.             CloseClipboard();
  821.         }
  822.     }
  823.     pCmdUI->Enable( pasteok );
  824. }
  825.  
  826. void CLeftView::OnEditDuplicate() 
  827. {
  828.     OnEditCopy();
  829.     CTreeCtrl& tree=tv->GetTreeCtrl();
  830.     HTREEITEM item=tree.GetSelectedItem();
  831.     tree.SelectItem(tree.GetParentItem(item));
  832.     OnEditPaste();
  833. }
  834.  
  835. void CLeftView::OnUpdateEditDuplicate(CCmdUI* pCmdUI) 
  836. {
  837.     CTreeCtrl& tree=tv->GetTreeCtrl();
  838.     HTREEITEM item=tree.GetSelectedItem();
  839.     DWORD type=0;
  840.     if (item!=0) 
  841.         type=tree.GetItemData(item);
  842.     pCmdUI->Enable(type>255);
  843. }
  844.  
  845.